/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VirtualPortCD.java
 *
 * Created on 16-sep-2011, 19:18:16
 */
package clases.principal;

import clases.modelo.Cd;
import clases.hsql.conexion.Conexion;
import clases.hsql.conexion.ConexionAux;
import clases.mensajes.Mensaje;
import java.sql.SQLException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import clases.mensajes.hilo.MensajeHilo;
import clases.modelo.Categoria;
import clases.modelo.CategoriaTabla;
import clases.modelo.Estuche;
import clases.modelo.TablaInfoEstuche;
import clases.terceros.RenderLista;
import clases.utilidades.Utilidad;
import clases.utilidades.formularios.Cambiar;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import clases.hsql.modelo.*;
import clases.hsql.modelo.tiposDeDatos.*;
import clases.mensajes.hilo.HiloGif;
import clases.reporte.hilo.HiloReporte;
import clases.reporte.modelo.ModeloCategoriaEstuche;
import clases.utilidades.archivos.Abrir;
import clases.utilidades.archivos.Guardar;
import clases.utilidades.archivos.HiloArchivo;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import javax.swing.JLabel;

/**
 *
 * @author Patricio Pérez Pinto
 */
public class VirtualPortCD extends javax.swing.JFrame {

    private List<Cd> cds = new ArrayList<Cd>();
    private DefaultTreeCellRenderer render;
    private DefaultMutableTreeNode arbolPrincipal;
    private Cd cdSeleccionado;
    private Estuche estucheSeleccionado;
    private String[] encTabla;
    private int cont = 0;//contador para que no entre en el value Change 
    private int cont2 = 0;//contador para que no entre en el value Change 
    private int ALTO_PANTALLA;
    private int ANCHO_PANTALLA;
    private HiloArchivo ha;
    private HiloGif hg;

    /** Creates new form VirtualPortCD */
    public VirtualPortCD() {
        initComponents();

        crearScriptBD();
        Conexion.conexionHSQL("BD/CDS");
        ConexionAux.conexionHSQL("BD/CDS");
        llenarCombos();

        estucheCd.setValue(1);
        espacioCd.setValue(1);
        estucheCdBuscar.setValue(1);

        inicializarArbol();
        cargarCdsAlArbol();
        Cambiar.iconoDeFormulario(this, "/iconos/logo.jpg");
        Cambiar.iconoDeFormulario(formEstuches, "/iconos/logo.jpg");
        Cambiar.iconoDeFormulario(formBuscar, "/iconos/logo.jpg");

        encTabla = new String[2];
        encTabla[0] = "Categoría";
        encTabla[1] = "Nº de Discos";

        inicializarTabla(0);
        reestablecerCampos();
        nombreCd.requestFocus();
        this.setLocationRelativeTo(null);
        this.setResizable(false);


        formEstuches.setBounds(0, 0, (int) formEstuches.getPreferredSize().getWidth() + 5, (int) formEstuches.getPreferredSize().getHeight() + 40);
        formEstuches.setResizable(false);
        formEstuches.setTitle("Estuches");


        getDimensionesPantalla();

        formBuscar.setBounds(this.ANCHO_PANTALLA - (int) formBuscar.getPreferredSize().getWidth() - 5, 0, (int) formBuscar.getPreferredSize().getWidth() + 5, (int) formBuscar.getPreferredSize().getHeight() + 40);
        formBuscar.setResizable(false);
        formBuscar.setTitle("Buscar CD");

        panelMensajeEscaneo.setVisible(false);
//        this.setAlwaysOnTop(true);

        if (categoriaCd.getItemCount() == 0) {
            panelInformacionCategoria.setVisible(true);
        } else {
            panelInformacionCategoria.setVisible(false);
        }
        lblPdf.setVisible(false);
        initAcercaDe();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        formEstuches = new javax.swing.JFrame();
        jPanel2 = new javax.swing.JPanel();
        panelInfoEstuche = new javax.swing.JPanel();
        jScrollPane5 = new javax.swing.JScrollPane();
        tablaEstuches = new javax.swing.JTable();
        lblTituloEstuche = new javax.swing.JLabel();
        lblCantidad = new javax.swing.JLabel();
        jPanel4 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        arbolEstuches = new javax.swing.JTree();
        jToolBar1 = new javax.swing.JToolBar();
        botonEliminarCd1 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        lblPdf = new javax.swing.JLabel();
        mensaje1 = new javax.swing.JLabel();
        formBuscar = new javax.swing.JFrame();
        jPanel3 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel6 = new javax.swing.JLabel();
        textoBusqueda = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        listaCds = new javax.swing.JList();
        botonBuscar = new javax.swing.JButton();
        botonEliminarCd = new javax.swing.JButton();
        estucheCdBuscar = new javax.swing.JSpinner();
        opEstuche = new javax.swing.JCheckBox();
        opCategoria = new javax.swing.JCheckBox();
        categoriaCdBuscar = new javax.swing.JComboBox();
        mensajeBuscar = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        lblDiscosEncontrados = new javax.swing.JLabel();
        grupo1 = new javax.swing.ButtonGroup();
        contenedor = new javax.swing.JTabbedPane();
        panelIngresar = new javax.swing.JPanel();
        panelInformacionCD = new javax.swing.JPanel();
        botonEliminarCd2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        espacioCd = new javax.swing.JSpinner();
        jLabel2 = new javax.swing.JLabel();
        nombreCd = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        categoriaCd = new javax.swing.JComboBox();
        jLabel4 = new javax.swing.JLabel();
        estucheCd = new javax.swing.JSpinner();
        jScrollPane1 = new javax.swing.JScrollPane();
        contenidoCd = new javax.swing.JTextArea();
        jLabel5 = new javax.swing.JLabel();
        mensajeEspacio = new javax.swing.JLabel();
        mensajeCategoria = new javax.swing.JLabel();
        mensajeEstuche = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        mensaje = new javax.swing.JLabel();
        botonEditar = new javax.swing.JButton();
        botonGuardar = new javax.swing.JButton();
        panelMensajeEscaneo = new javax.swing.JPanel();
        jLabel14 = new javax.swing.JLabel();
        lblMen = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        opTodo = new javax.swing.JRadioButton();
        opSuperficie = new javax.swing.JRadioButton();
        panelInformacionCategoria = new javax.swing.JPanel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        opFormEstuche = new javax.swing.JCheckBox();
        opFormBuscar = new javax.swing.JCheckBox();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        menuItemAcercaDe = new javax.swing.JMenuItem();

        formEstuches.setFocusableWindowState(false);
        formEstuches.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formEstuchesWindowClosing(evt);
            }
        });

        jPanel2.setBackground(new java.awt.Color(255, 255, 255));
        jPanel2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        panelInfoEstuche.setBackground(new java.awt.Color(255, 255, 255));
        panelInfoEstuche.setBorder(javax.swing.BorderFactory.createTitledBorder("Información del Estuche"));
        panelInfoEstuche.setLayout(new java.awt.BorderLayout());

        tablaEstuches.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        tablaEstuches.setEnabled(false);
        jScrollPane5.setViewportView(tablaEstuches);

        panelInfoEstuche.add(jScrollPane5, java.awt.BorderLayout.CENTER);

        lblTituloEstuche.setFont(new java.awt.Font("Tahoma", 1, 11));
        lblTituloEstuche.setText("Estuche ");
        panelInfoEstuche.add(lblTituloEstuche, java.awt.BorderLayout.PAGE_START);

        lblCantidad.setFont(new java.awt.Font("Tahoma", 1, 11));
        lblCantidad.setText("Cantidad de Discos:");
        panelInfoEstuche.add(lblCantidad, java.awt.BorderLayout.PAGE_END);

        jPanel2.add(panelInfoEstuche, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 300, 270, 280));

        jPanel4.setBackground(new java.awt.Color(255, 255, 255));
        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Estuches"));
        jPanel4.setLayout(new java.awt.BorderLayout());

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
        arbolEstuches.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        arbolEstuches.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                arbolEstuchesMouseReleased(evt);
            }
        });
        jScrollPane3.setViewportView(arbolEstuches);

        jPanel4.add(jScrollPane3, java.awt.BorderLayout.CENTER);

        jToolBar1.setBackground(new java.awt.Color(255, 255, 255));
        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);

        botonEliminarCd1.setBackground(new java.awt.Color(255, 255, 255));
        botonEliminarCd1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/borrarDisco.png"))); // NOI18N
        botonEliminarCd1.setToolTipText("Eliminar Disco Seleccionado");
        botonEliminarCd1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarCd1ActionPerformed(evt);
            }
        });
        jToolBar1.add(botonEliminarCd1);

        jButton3.setBackground(new java.awt.Color(255, 255, 255));
        jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/pdf.gif"))); // NOI18N
        jButton3.setToolTipText("Reporte Estuche");
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton3);

        lblPdf.setFont(new java.awt.Font("Tahoma", 1, 11));
        lblPdf.setText("Constuyendo Reporte");
        jToolBar1.add(lblPdf);

        jPanel4.add(jToolBar1, java.awt.BorderLayout.PAGE_END);

        jPanel2.add(jPanel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 270, 280));

        mensaje1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel2.add(mensaje1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 280, 260, 20));

        formEstuches.getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        formBuscar.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formBuscarWindowClosing(evt);
            }
        });

        jPanel3.setBackground(new java.awt.Color(255, 255, 255));
        jPanel3.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Buscar CD"));
        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel6.setText("Buscar:");
        jPanel1.add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 20, -1, 20));

        textoBusqueda.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                textoBusquedaKeyReleased(evt);
            }
        });
        jPanel1.add(textoBusqueda, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 20, 160, -1));

        listaCds.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                listaCdsMouseReleased(evt);
            }
        });
        jScrollPane2.setViewportView(listaCds);

        jPanel1.add(jScrollPane2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 110, 310, 140));

        botonBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/buscarPequeno.png"))); // NOI18N
        botonBuscar.setText("Buscar");
        botonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonBuscarActionPerformed(evt);
            }
        });
        jPanel1.add(botonBuscar, new org.netbeans.lib.awtextra.AbsoluteConstraints(190, 50, 90, 20));

        botonEliminarCd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/borrarDisco.png"))); // NOI18N
        botonEliminarCd.setText("Eliminar CD seleccionado");
        botonEliminarCd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarCdActionPerformed(evt);
            }
        });
        jPanel1.add(botonEliminarCd, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 250, 170, 20));

        estucheCdBuscar.setEnabled(false);
        jPanel1.add(estucheCdBuscar, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 50, 50, -1));

        opEstuche.setBackground(new java.awt.Color(255, 255, 255));
        opEstuche.setText("Estuche Nº:");
        opEstuche.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                opEstucheActionPerformed(evt);
            }
        });
        jPanel1.add(opEstuche, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 50, 90, 20));

        opCategoria.setBackground(new java.awt.Color(255, 255, 255));
        opCategoria.setText("Categoría:");
        opCategoria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                opCategoriaActionPerformed(evt);
            }
        });
        jPanel1.add(opCategoria, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 80, 90, 20));

        categoriaCdBuscar.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        categoriaCdBuscar.setEnabled(false);
        jPanel1.add(categoriaCdBuscar, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 80, 160, -1));

        jPanel3.add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 330, 280));

        mensajeBuscar.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel3.add(mensajeBuscar, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 300, 320, 20));

        jLabel7.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabel7.setText("Discos Encontrados:");
        jPanel3.add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 280, -1, -1));

        lblDiscosEncontrados.setFont(new java.awt.Font("Tahoma", 1, 12));
        lblDiscosEncontrados.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        lblDiscosEncontrados.setText("0");
        jPanel3.add(lblDiscosEncontrados, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 280, 180, -1));

        formBuscar.getContentPane().add(jPanel3, java.awt.BorderLayout.CENTER);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Java Virtual Port CD v1.1");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        getContentPane().setLayout(new java.awt.CardLayout());

        contenedor.setBackground(new java.awt.Color(255, 255, 255));

        panelIngresar.setBackground(new java.awt.Color(255, 255, 255));
        panelIngresar.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        panelInformacionCD.setBackground(new java.awt.Color(255, 255, 255));
        panelInformacionCD.setBorder(javax.swing.BorderFactory.createTitledBorder("Información del CD"));
        panelInformacionCD.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        botonEliminarCd2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/borrarDisco.png"))); // NOI18N
        botonEliminarCd2.setText("Eliminar CD");
        botonEliminarCd2.setEnabled(false);
        botonEliminarCd2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarCd2ActionPerformed(evt);
            }
        });
        panelInformacionCD.add(botonEliminarCd2, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 240, 130, 20));

        jLabel1.setText("Estuche Nº:");
        panelInformacionCD.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 20, -1, 20));

        espacioCd.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                espacioCdMouseReleased(evt);
            }
        });
        espacioCd.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                espacioCdStateChanged(evt);
            }
        });
        panelInformacionCD.add(espacioCd, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 50, 50, -1));

        jLabel2.setText("Espacio en Estuche:");
        panelInformacionCD.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 50, -1, 20));

        nombreCd.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                nombreCdKeyReleased(evt);
            }
        });
        panelInformacionCD.add(nombreCd, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 80, 220, -1));

        jLabel3.setText("Nombre:");
        panelInformacionCD.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 80, -1, 20));

        categoriaCd.setEditable(true);
        categoriaCd.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        categoriaCd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                categoriaCdActionPerformed(evt);
            }
        });
        panelInformacionCD.add(categoriaCd, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 110, 220, -1));

        jLabel4.setText("Contenido:");
        panelInformacionCD.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(350, 20, -1, 20));

        estucheCd.setOpaque(false);
        estucheCd.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                estucheCdMouseReleased(evt);
            }
        });
        estucheCd.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                estucheCdStateChanged(evt);
            }
        });
        panelInformacionCD.add(estucheCd, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 20, 50, -1));

        contenidoCd.setColumns(20);
        contenidoCd.setFont(new java.awt.Font("Tahoma", 0, 11));
        contenidoCd.setRows(5);
        contenidoCd.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                contenidoCdKeyReleased(evt);
            }
        });
        jScrollPane1.setViewportView(contenidoCd);

        panelInformacionCD.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 20, 200, 170));

        jLabel5.setText("Categoría:");
        panelInformacionCD.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 110, -1, 20));
        panelInformacionCD.add(mensajeEspacio, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 50, 140, 20));
        panelInformacionCD.add(mensajeCategoria, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 140, 200, 20));
        panelInformacionCD.add(mensajeEstuche, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 20, 140, 20));

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/cdPequeno.png"))); // NOI18N
        jButton1.setText("Escanear CD");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        panelInformacionCD.add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 190, 200, 20));
        panelInformacionCD.add(mensaje, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 170, 310, 20));

        botonEditar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/editarCd.png"))); // NOI18N
        botonEditar.setText("Editar CD");
        botonEditar.setEnabled(false);
        botonEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEditarActionPerformed(evt);
            }
        });
        panelInformacionCD.add(botonEditar, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 220, 130, 20));

        botonGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/guardarDisco.png"))); // NOI18N
        botonGuardar.setMnemonic('g');
        botonGuardar.setText("Guardar");
        botonGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonGuardarActionPerformed(evt);
            }
        });
        panelInformacionCD.add(botonGuardar, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 240, 110, 20));

        panelMensajeEscaneo.setBackground(new java.awt.Color(255, 255, 255));
        panelMensajeEscaneo.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel14.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/procesando.gif"))); // NOI18N
        panelMensajeEscaneo.add(jLabel14, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 0, -1, 30));

        lblMen.setFont(new java.awt.Font("Tahoma", 1, 14));
        lblMen.setText("Escaneando CD");
        panelMensajeEscaneo.add(lblMen, new org.netbeans.lib.awtextra.AbsoluteConstraints(60, 0, 140, 30));

        jButton2.setText("Cancelar Acción");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        panelMensajeEscaneo.add(jButton2, new org.netbeans.lib.awtextra.AbsoluteConstraints(190, 0, -1, 30));

        panelInformacionCD.add(panelMensajeEscaneo, new org.netbeans.lib.awtextra.AbsoluteConstraints(300, 240, 320, 30));

        opTodo.setBackground(new java.awt.Color(255, 255, 255));
        grupo1.add(opTodo);
        opTodo.setText("TODO");
        panelInformacionCD.add(opTodo, new org.netbeans.lib.awtextra.AbsoluteConstraints(500, 210, -1, -1));

        opSuperficie.setBackground(new java.awt.Color(255, 255, 255));
        grupo1.add(opSuperficie);
        opSuperficie.setSelected(true);
        opSuperficie.setText("Superficie");
        panelInformacionCD.add(opSuperficie, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 210, -1, -1));

        panelInformacionCategoria.setBackground(new java.awt.Color(255, 255, 255));
        panelInformacionCategoria.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/flecha.png"))); // NOI18N
        panelInformacionCategoria.add(jLabel8, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 0, -1, -1));

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel9.setForeground(new java.awt.Color(255, 0, 0));
        jLabel9.setText("Para crear una categoría nueva, solamente escríbala y");
        panelInformacionCategoria.add(jLabel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 40, 360, -1));

        jLabel10.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel10.setForeground(new java.awt.Color(255, 0, 0));
        jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabel10.setText("guarde el CD. La categoría se creará automáticamente.");
        panelInformacionCategoria.add(jLabel10, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 60, 360, -1));

        jLabel11.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel11.setForeground(new java.awt.Color(255, 0, 0));
        jLabel11.setText("Un ejemplo de categoría, puede ser: Juego, Video, etc.");
        panelInformacionCategoria.add(jLabel11, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 80, 350, -1));

        panelInformacionCD.add(panelInformacionCategoria, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 110, 380, 100));

        panelIngresar.add(panelInformacionCD, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 630, 280));

        opFormEstuche.setBackground(new java.awt.Color(255, 255, 255));
        opFormEstuche.setText("Estuches");
        opFormEstuche.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                opFormEstucheActionPerformed(evt);
            }
        });
        panelIngresar.add(opFormEstuche, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 290, 90, -1));

        opFormBuscar.setBackground(new java.awt.Color(255, 255, 255));
        opFormBuscar.setText("Buscar CD");
        opFormBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                opFormBuscarActionPerformed(evt);
            }
        });
        panelIngresar.add(opFormBuscar, new org.netbeans.lib.awtextra.AbsoluteConstraints(100, 290, 100, 20));

        contenedor.addTab("Ingresar CD", panelIngresar);

        getContentPane().add(contenedor, "card2");

        jMenu1.setText("Ayuda");

        menuItemAcercaDe.setText("Acerca de...");
        jMenu1.add(menuItemAcercaDe);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonGuardarActionPerformed
        guardarCd();
    }//GEN-LAST:event_botonGuardarActionPerformed

    private void botonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonBuscarActionPerformed
        accionBuscar();
    }//GEN-LAST:event_botonBuscarActionPerformed

    private void listaCdsMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listaCdsMouseReleased
        if (evt.getClickCount() == 2 && !cds.isEmpty()) {
            cargarCd(listaCds.getSelectedIndex());
        } else {
        }
    }//GEN-LAST:event_listaCdsMouseReleased

    private void botonEliminarCdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarCdActionPerformed
//        eliminarCd(listaCds.getSelectedIndex());
        String nombre = listaCds.getSelectedValue().toString();
        if (Mensaje.preguntaSiNo("¿Realmente desea eliminar el CD \"" + nombre + "\"?") == Mensaje.SI) {
            eliminarCd(listaCds.getSelectedIndex());
        }
    }//GEN-LAST:event_botonEliminarCdActionPerformed

    private void opEstucheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opEstucheActionPerformed
        if (opEstuche.isSelected()) {
            estucheCdBuscar.setEnabled(true);
        } else {
            estucheCdBuscar.setEnabled(false);
        }
    }//GEN-LAST:event_opEstucheActionPerformed

    private void opCategoriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opCategoriaActionPerformed
        if (opCategoria.isSelected()) {
            categoriaCdBuscar.setEnabled(true);
        } else {
            categoriaCdBuscar.setEnabled(false);
        }
    }//GEN-LAST:event_opCategoriaActionPerformed

    private void arbolEstuchesMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_arbolEstuchesMouseReleased
        try {
            if (evt.getClickCount() == 2) {
                String nodoSeleccionado = arbolEstuches.getSelectionModel().getSelectionPath().getLastPathComponent().toString();
                if (nodoSeleccionado.contains("[")) {//SI ES CD
                    int CODIGO_CD = 0;
                    String[] nodo = nodoSeleccionado.split(" ");
                    nodo[CODIGO_CD] = nodo[CODIGO_CD].replaceAll("\\[", "");
                    nodo[CODIGO_CD] = nodo[CODIGO_CD].replaceAll("\\]", "");
                    String codigoCd = nodo[CODIGO_CD];
                    cdSeleccionado = Cd.getCd(codigoCd);
                    cargarCd(cdSeleccionado);
                }
            }
            String nodoSeleccionado = arbolEstuches.getSelectionModel().getSelectionPath().getLastPathComponent().toString();
            if (nodoSeleccionado.contains("(")) {//SI ES ESTUCHE
                int CODIGO_EST = 0;
                String[] nodo = nodoSeleccionado.split(" ");
                nodo[CODIGO_EST] = nodo[CODIGO_EST].replaceAll("\\(", "");
                nodo[CODIGO_EST] = nodo[CODIGO_EST].replaceAll("\\)", "");
                String codigoEst = nodo[CODIGO_EST];
                estucheSeleccionado = Cd.getEstuche(codigoEst);
                cargarDatosEstuche(estucheSeleccionado);
            }
        } catch (Exception e) {
        }
    }//GEN-LAST:event_arbolEstuchesMouseReleased

    private void botonEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEditarActionPerformed
        /*RESCATANDO INFORMACION-------------------------------------------*/
        int estuche = Integer.parseInt(estucheCd.getValue().toString());
        int espacio = Integer.parseInt(espacioCd.getValue().toString());
        String categoria = categoriaCd.getSelectedItem().toString();
        String nombre = nombreCd.getText().trim();
        /*RESCATANDO INFORMACION-------------------------------------------*/

        /*VALIDACIONES---------------------------------------------------------------------------------*/
        if (estuche < 1) {
            MensajeHilo.setMensaje(mensajeEstuche, "Números mayores que 0", Color.red, 5);
        } else if (espacio < 1) {
            MensajeHilo.setMensaje(mensajeEspacio, "Números mayores que 0", Color.red, 5);
        } else if (nombre.equalsIgnoreCase("")) {
            nombreCd.setText("");
            nombreCd.requestFocus();
//            MensajeHilo.setMensaje(mensaje, "Revise el nombre del CD", Color.red, 5);
        } else if (categoria.equalsIgnoreCase("")) {
            categoriaCd.requestFocus();
            MensajeHilo.setMensaje(mensajeCategoria, "Revise la categoría del CD", Color.red, 5);
            /*VALIDACIONES---------------------------------------------------------------------------------*/
        } else {
            /*SI EL ESTUCHE O LA CATEGORÍA NO ESTAN, LOS CREO*/
            if (!isEstuche(estuche)) {
                crearEstuche(estuche);
                MensajeHilo.setMensaje(mensajeEstuche, "Estuche " + estuche + " creado!", Color.blue, 5);
            }
            if (!isCategoria(categoria)) {
                crearCategoria(categoria);
                MensajeHilo.setMensaje(mensajeCategoria, "Categoría \"" + categoria + "\"creada!", Color.blue, 5);
            }
            /*SI EL ESTUCHE O LA CATEGORÍA NO ESTAN, LOS CREO*/


            if (!Cd.isEspacioOcupado(estuche, espacio)) {/*SI EL ESPACIO NO ESTA OCUPADO*/
                /*GUARDANDO EL CD-------------------------------------------------------------------------------------------------*/
                Cd disco = new Cd(nombre, categoria, Integer.toString(espacio), Integer.toString(estuche), contenidoCd.getText());
                if (guardarDisco(disco)) {
                    MensajeHilo.setMensaje(mensaje1, "CD guardado!", Color.blue, 5);
                    reestablecerCampos();
                } else {
                    MensajeHilo.setMensaje(mensaje1, "Error al Guardar CD!", Color.red, 5);
                }
                /*CARGO LOS CDS AL ARBOL*/
                cargarCdsAlArbol();
                /*GUARDANDO EL CD-------------------------------------------------------------------------------------------------*/
            } else {//SI ESTA OCUPADO, PREGUNTO SI DESEA REEMPLAZARLO
                String nomCd = Cd.getNombreCd(estuche, espacio);
                if (Mensaje.preguntaSiNo("¿Desea realmente editar el CD \"" + nomCd + "\"?") == Mensaje.SI) {
                    Cd disco = new Cd(nombre, categoria, Integer.toString(espacio), Integer.toString(estuche), contenidoCd.getText());
                    if (Cd.reemplazarCd(estuche, espacio, disco)) {
                        MensajeHilo.setMensaje(mensaje1, "CD ACTUALIZADO!", Color.blue, 5);
                        reestablecerCampos();
                    } else {
                        MensajeHilo.setMensaje(mensaje1, "Error al EDITAR un CD!", Color.red, 5);
                    }
                }
                /*CARGO LOS CDS AL ARBOL*/
                cargarCdsAlArbol();
            }
        }
    }//GEN-LAST:event_botonEditarActionPerformed

    private void botonEliminarCd1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarCd1ActionPerformed
        try {
            String nodoSeleccionado = arbolEstuches.getSelectionModel().getSelectionPath().getLastPathComponent().toString();
            if (nodoSeleccionado.contains("[")) {//SI ES CD
                int CODIGO = 0;
                String[] nodo = nodoSeleccionado.split(" ");
                nodo[CODIGO] = nodo[CODIGO].replaceAll("\\[", "");
                nodo[CODIGO] = nodo[CODIGO].replaceAll("\\]", "");
                String codigo = nodo[CODIGO];
                cdSeleccionado = Cd.getCd(codigo);
                if (Mensaje.preguntaSiNo("¿Realmente desea eliminar el CD \"" + cdSeleccionado.getNombre() + "\" del estuche Nº " + cdSeleccionado.getEstuche() + "?") == Mensaje.SI) {
                    eliminarCd(cdSeleccionado, mensaje1);
                }
            }
        } catch (Exception e) {
        }
    }//GEN-LAST:event_botonEliminarCd1ActionPerformed

    private void nombreCdKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_nombreCdKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            categoriaCd.requestFocus();
        }
    }//GEN-LAST:event_nombreCdKeyReleased

    private void contenidoCdKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_contenidoCdKeyReleased
    }//GEN-LAST:event_contenidoCdKeyReleased

    private void categoriaCdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_categoriaCdActionPerformed
        if (evt.getActionCommand().equalsIgnoreCase("comboBoxEdited")) {
            contenidoCd.requestFocus();
        }
    }//GEN-LAST:event_categoriaCdActionPerformed

private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
    Conexion.guardarCambias();
}//GEN-LAST:event_formWindowClosing

private void estucheCdMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_estucheCdMouseReleased
}//GEN-LAST:event_estucheCdMouseReleased

private void espacioCdMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_espacioCdMouseReleased
}//GEN-LAST:event_espacioCdMouseReleased

private void espacioCdStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_espacioCdStateChanged
    if (cont == 0) {
        cont++;
    } else {
        int nombreEstuche, espacio;
        nombreEstuche = Integer.parseInt(estucheCd.getValue().toString());
        espacio = Integer.parseInt(espacioCd.getValue().toString());

        Cd cd = Cd.getCd(nombreEstuche, espacio);
        if (cd != null) {
            this.cargarCd(cd);
        } else {
            this.reestablecerCampos();
        }
    }

}//GEN-LAST:event_espacioCdStateChanged

private void estucheCdStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_estucheCdStateChanged
    if (cont2 == 0) {
        cont2++;
    } else {
        int nombreEstuche, espacio;
        nombreEstuche = Integer.parseInt(estucheCd.getValue().toString());
        espacio = Integer.parseInt(espacioCd.getValue().toString());

        Cd cd = Cd.getCd(nombreEstuche, espacio);
        if (cd != null) {
            this.cargarCd(cd);
        } else {
            this.reestablecerCampos();
        }
    }
}//GEN-LAST:event_estucheCdStateChanged

private void textoBusquedaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_textoBusquedaKeyReleased
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
        accionBuscar();
    }
}//GEN-LAST:event_textoBusquedaKeyReleased

private void opFormEstucheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opFormEstucheActionPerformed

    formEstuches.setVisible(opFormEstuche.isSelected());
    this.requestFocus();
}//GEN-LAST:event_opFormEstucheActionPerformed

private void opFormBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opFormBuscarActionPerformed

    formBuscar.setVisible(opFormBuscar.isSelected());
    this.requestFocus();
}//GEN-LAST:event_opFormBuscarActionPerformed

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
    boolean isTodo = opTodo.isSelected();
    if (Abrir.abrirUbicacion("Abrir")) {
        File f = new File(Abrir.getRuta());
        ha = new HiloArchivo(f, contenidoCd, isTodo);
        ha.start();
        hg = new HiloGif(ha, panelMensajeEscaneo, lblMen);
        hg.start();
    }
}//GEN-LAST:event_jButton1ActionPerformed

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
    ha.stop();
    hg.stop();
    panelMensajeEscaneo.setVisible(false);
}//GEN-LAST:event_jButton2ActionPerformed

private void formEstuchesWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formEstuchesWindowClosing
    opFormEstuche.setSelected(false);
}//GEN-LAST:event_formEstuchesWindowClosing

private void formBuscarWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formBuscarWindowClosing
    opFormBuscar.setSelected(false);// TODO add your handling code here:
}//GEN-LAST:event_formBuscarWindowClosing

private void botonEliminarCd2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarCd2ActionPerformed
    int nombreEstuche, espacio;
    nombreEstuche = Integer.parseInt(estucheCd.getValue().toString());
    espacio = Integer.parseInt(espacioCd.getValue().toString());

    Cd cd = Cd.getCd(nombreEstuche, espacio);
    if (Mensaje.preguntaSiNo("¿Realmente desea eliminar el CD \"" + cd.getNombre() + "\"?") == Mensaje.SI) {
        this.eliminarCd(cd, mensaje);
        this.reestablecerCampos();
    }
}//GEN-LAST:event_botonEliminarCd2ActionPerformed

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
    try {
        String nodoSeleccionado = arbolEstuches.getSelectionModel().getSelectionPath().getLastPathComponent().toString();
        if (nodoSeleccionado.contains("(")) {//SI ES ESTUCHE
            int CODIGO_EST = 0;
            String[] nodo = nodoSeleccionado.split(" ");
            nodo[CODIGO_EST] = nodo[CODIGO_EST].replaceAll("\\(", "");
            nodo[CODIGO_EST] = nodo[CODIGO_EST].replaceAll("\\)", "");
            String codigoEst = nodo[CODIGO_EST];
            estucheSeleccionado = Cd.getEstuche(codigoEst);
            crearGrafico(estucheSeleccionado);
        }else if(nodoSeleccionado.equalsIgnoreCase("Estuches")){
            crearReporteDeTodosLosDiscos();
        }
    } catch (Exception e) {
    }
}//GEN-LAST:event_jButton3ActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        clases.utilidades.formularios.Cambiar.aparienciaFormulario();
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new VirtualPortCD().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTree arbolEstuches;
    private javax.swing.JButton botonBuscar;
    private javax.swing.JButton botonEditar;
    private javax.swing.JButton botonEliminarCd;
    private javax.swing.JButton botonEliminarCd1;
    private javax.swing.JButton botonEliminarCd2;
    private javax.swing.JButton botonGuardar;
    private javax.swing.JComboBox categoriaCd;
    private javax.swing.JComboBox categoriaCdBuscar;
    private javax.swing.JTabbedPane contenedor;
    private javax.swing.JTextArea contenidoCd;
    private javax.swing.JSpinner espacioCd;
    private javax.swing.JSpinner estucheCd;
    private javax.swing.JSpinner estucheCdBuscar;
    private javax.swing.JFrame formBuscar;
    private javax.swing.JFrame formEstuches;
    private javax.swing.ButtonGroup grupo1;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JLabel lblCantidad;
    private javax.swing.JLabel lblDiscosEncontrados;
    private javax.swing.JLabel lblMen;
    private javax.swing.JLabel lblPdf;
    private javax.swing.JLabel lblTituloEstuche;
    private javax.swing.JList listaCds;
    private javax.swing.JLabel mensaje;
    private javax.swing.JLabel mensaje1;
    private javax.swing.JLabel mensajeBuscar;
    private javax.swing.JLabel mensajeCategoria;
    private javax.swing.JLabel mensajeEspacio;
    private javax.swing.JLabel mensajeEstuche;
    private javax.swing.JMenuItem menuItemAcercaDe;
    private javax.swing.JTextField nombreCd;
    private javax.swing.JCheckBox opCategoria;
    private javax.swing.JCheckBox opEstuche;
    private javax.swing.JCheckBox opFormBuscar;
    private javax.swing.JCheckBox opFormEstuche;
    private javax.swing.JRadioButton opSuperficie;
    private javax.swing.JRadioButton opTodo;
    private javax.swing.JPanel panelInfoEstuche;
    private javax.swing.JPanel panelInformacionCD;
    private javax.swing.JPanel panelInformacionCategoria;
    private javax.swing.JPanel panelIngresar;
    private javax.swing.JPanel panelMensajeEscaneo;
    private javax.swing.JTable tablaEstuches;
    private javax.swing.JTextField textoBusqueda;
    // End of variables declaration//GEN-END:variables

    private boolean guardarDisco(Cd disco) {
        boolean discoGuardado = false;
        try {
            /*CAMBIANDO LAS COMILLAS SIMPLES DEL CONTENIDO, A COMILLAS DOBLES, PARA NO CAUSAR CONFLICTO CON LA BD*/
            disco.setContenido(Cambiar.comillasAdoble(disco.getContenido()));
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.sentencia.execute("INSERT INTO cd VALUES(null, " + disco.getEspacio() + ", '" + disco.getNombre() + "', " + disco.getCodigoCategoria() + "," + disco.getCodigoEstuche() + ",'" + disco.getContenido() + "')");
            Conexion.sentencia.close();
            discoGuardado = true;
        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
            Mensaje.error("ERROR AL GUARDAR CD.\nCausa: " + ex.getCause().getLocalizedMessage());
        }
        return discoGuardado;
    }

    private boolean isEstuche(int estuche) {
        boolean isEstuche = false;
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.rs = Conexion.sentencia.executeQuery("SELECT * FROM estuche WHERE num_est = " + estuche + "");
            if (Conexion.rs.next()) {
                isEstuche = true;
            }
            Conexion.sentencia.close();
        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return isEstuche;
    }

    private void crearEstuche(int estuche) {
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.sentencia.execute("INSERT INTO estuche VALUES(null, " + estuche + ")");
            Conexion.sentencia.close();

        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private boolean isCategoria(String categoria) {
        boolean isCategoria = false;
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.rs = Conexion.sentencia.executeQuery("SELECT * FROM categoria WHERE nom_cat = '" + categoria + "'");
            if (Conexion.rs.next()) {
                isCategoria = true;
            }
            Conexion.sentencia.close();
        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return isCategoria;
    }

    private void crearCategoria(String categoria) {
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.sentencia.execute("INSERT INTO categoria VALUES(null, '" + categoria + "')");
            Conexion.sentencia.close();
            llenarCombos();

        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void reestablecerCampos() {
        nombreCd.setText("");
        contenidoCd.setText("");
        nombreCd.requestFocus();
        this.botonGuardar.setEnabled(true);
        this.botonEditar.setEnabled(false);
        this.botonEliminarCd2.setEnabled(false);
        resaltarColorCd(Color.white);
    }

    private void cargarCd(int numero) {
        Cd disco = cds.get(numero);
        estucheCd.setValue(Integer.parseInt(disco.getEstuche()));
        espacioCd.setValue(Integer.parseInt(disco.getEspacio()));
        nombreCd.setText(disco.getNombre());
        categoriaCd.setSelectedItem(disco.getCategoria());
        contenidoCd.setText(disco.getContenido());
        this.botonGuardar.setEnabled(false);
        this.botonEditar.setEnabled(true);
        this.botonEliminarCd2.setEnabled(true);
        resaltarColorCd(new Color(255, 231, 186));
    }

    private void eliminarCd(Cd disco, JLabel lblMensaje) {
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.sentencia.execute("DELETE FROM cd WHERE cod_cd = " + disco.getCodigo());
            Conexion.sentencia.close();
            MensajeHilo.setMensaje(lblMensaje, "CD \"" + disco.getNombre() + "\" eliminado!", Color.blue, 5);
            accionBuscar();
            /*CARGO LOS CDS AL ARBOL*/
            cargarCdsAlArbol();
        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void eliminarCd(int numeroCdLista) {
        String codCd = cds.get(numeroCdLista).getCodigo();
        try {
            Conexion.sentencia = Conexion.con.createStatement();
            Conexion.sentencia.execute("DELETE FROM cd WHERE cod_cd = " + codCd);
            Conexion.sentencia.close();
            MensajeHilo.setMensaje(mensajeBuscar, "CD \"" + cds.get(numeroCdLista).getNombre() + "\" eliminado!", Color.blue, 5);
            cds.remove(numeroCdLista);
            accionBuscar();
            /*CARGO LOS CDS AL ARBOL*/
            cargarCdsAlArbol();
        } catch (SQLException ex) {
            Logger.getLogger(VirtualPortCD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void cargarDiscosEnLista() {
        final String[] discos = new String[(!cds.isEmpty() ? cds.size() : 1)];
        lblDiscosEncontrados.setText(Integer.toString(cds.size()));
        Cd cd;
        for (int i = 0; i < cds.size(); i++) {
            cd = cds.get(i);
            /*DISCOS CON EL NUMERO Y ESTUCHE CORRESPONDIENTE*/
            discos[i] = "[CD " + cd.getEspacio() + "] [EST " + cd.getEstuche() + "] " + cd.getNombre();
        }
        listaCds.setListData(discos);
        RenderLista rl = new RenderLista();
        listaCds.setCellRenderer(rl);
    }

    private void aumentarEspacioDeCdEnUno() {
        int esp = Integer.parseInt(espacioCd.getValue().toString());
        esp++;
        espacioCd.setValue(esp);
    }

    private DefaultMutableTreeNode crearEstuchesDeArbol(String nombreEstuche, List<Cd> listadoCds) {
        boolean hayDiscos = false;
        DefaultMutableTreeNode estuche = null;
        DefaultMutableTreeNode cd = null;
        estuche = new DefaultMutableTreeNode(nombreEstuche);

        Cd disco;
        for (int i = 0; i < listadoCds.size(); i++) {
            hayDiscos = true;
            disco = listadoCds.get(i);
            cd = new DefaultMutableTreeNode("[" + disco.getCodigo() + "] CD " + disco.getEspacio() + " - " + disco.getNombre());
            estuche.add(cd);
        }
        /*SI EL ESTUCHE NO TIENE DISCOS, AGREGO UNO CON LA FRASE "NO HAY DISCOS"*/
        if (!hayDiscos) {
            estuche.add(new DefaultMutableTreeNode("No tiene Discos"));
        }
        return estuche;
    }

    private void inicializarArbol() {
        render = (DefaultTreeCellRenderer) arbolEstuches.getCellRenderer();
        render.setLeafIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/cdPequeno.png")));
        render.setClosedIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/cerrado.png")));
        render.setOpenIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/abierto.png")));
        arbolPrincipal = new DefaultMutableTreeNode("Estuches");
    }

    private void cargarCdsAlArbol() {
        /*CREO DOS LISTAS, UNA PARA LOS ESTUCHES Y LA OTRA PARA LOS CDS*/
        List<Estuche> estuches = new ArrayList<Estuche>();
        List<Cd> listadoCds = new ArrayList<Cd>();
        /*CREO DOS LISTAS, UNA PARA LOS ESTUCHES Y LA OTRA PARA LOS CDS*/

        DefaultMutableTreeNode arbolEstuche;
        Estuche est;

        /*ACA OBTENGO TODOS LOS ESTUCHES DESDE LA BD*/
        estuches = Cd.getListaDeEstuches();
        arbolPrincipal.removeAllChildren();

        /*CICLO PARA RECORRER LOS ESTUCHES-----------------------------------*/
        for (int i = 0; i < estuches.size(); i++) {
            /*OBTENGO UN ESTUCHE*/
            est = estuches.get(i);
            /*OBTENGO TODOS LOS CDS DE DICHO ESTUCHE*/
            listadoCds = Cd.getTodosLosCds(est.getCodigo());
            /*CREO UN ARBOL DE DICHO ESTUCHE CON SUS RESPECTIVOS CDS*/
            arbolEstuche = crearEstuchesDeArbol("(" + est.getCodigo() + ") " + est.getNombre(), listadoCds);
            /*Y LO AGREGO AL ARBOL PRINCIPAL*/
            arbolPrincipal.add(arbolEstuche);
        }
        /*CICLO PARA RECORRER LOS ESTUCHES-----------------------------------*/

        arbolEstuches.setModel(new javax.swing.tree.DefaultTreeModel(arbolPrincipal));
        arbolEstuches.setRootVisible(true);
    }

    private void cargarCd(Cd disco) {
        estucheCd.setValue(Integer.parseInt(disco.getEstuche()));
        espacioCd.setValue(Integer.parseInt(disco.getEspacio()));
        nombreCd.setText(disco.getNombre());
        categoriaCd.setSelectedItem(disco.getCategoria());
        contenidoCd.setText(disco.getContenido());
        this.botonGuardar.setEnabled(false);
        this.botonEditar.setEnabled(true);
        this.botonEliminarCd2.setEnabled(true);
        resaltarColorCd(new Color(255, 231, 186));
    }

    private void llenarCombos() {
        Utilidad.llenarCombo("nom_cat", "categoria", categoriaCd);
        Utilidad.llenarCombo("nom_cat", "categoria", categoriaCd);
        Utilidad.llenarCombo("nom_cat", "categoria", categoriaCdBuscar);
    }

    private void cargarDatosEstuche(Estuche estuche) {
        List<Categoria> listaCategorias = new ArrayList<Categoria>();
        /*OBTENGO TODAS LAS CATEGORIAS DE LA BD*/
        listaCategorias = Cd.getTodasLasCategorias();

        /*OBTENGO LA CANTIDAD DE DISCOS DEL ESTUCHE DETERMINADO*/
        int cantidadDeDiscos = Cd.getCantidadDeDiscos(estuche);

        /*OBTENGO EL NOMBRE DEL ESTUCHE Y LO PONGO EN EL LABEL, AL IGUAL QUE LA CANTIDAD*/
        lblTituloEstuche.setText(estuche.getNombre().toUpperCase());
        lblCantidad.setText("Cantidad de Discos: " + cantidadDeDiscos);

        /*EN EL OBJETO datosTabla, TENGO TODOS LOS DATOS DEL ESTUCHE PARA LLENAR LA TABLA*/
        TablaInfoEstuche datosTabla = getInfoEstuche(listaCategorias, estuche);
        /*LLENO LA TABLA CON LOS DATOS DEL ESTUCHE (NOMBRE, CANTIDAD)*/
        llenarTablaConDatos(datosTabla);
    }

    private void inicializarTabla(int filas) {
        tablaEstuches.setModel(new DefaultTableModel(encTabla, filas));
    }

    private void guardarCd() {
        try {
            /*RESCATANDO INFORMACION-------------------------------------------*/
            int estuche = Integer.parseInt(estucheCd.getValue().toString());
            int espacio = Integer.parseInt(espacioCd.getValue().toString());
            String categoria = categoriaCd.getSelectedItem().toString();
            String nombre = nombreCd.getText().trim();
            /*RESCATANDO INFORMACION-------------------------------------------*/

            /*VALIDACIONES---------------------------------------------------------------------------------*/
            if (estuche < 1) {
                MensajeHilo.setMensaje(mensajeEstuche, "Números mayores que 0", Color.red, 5);
            } else if (espacio < 1) {
                MensajeHilo.setMensaje(mensajeEspacio, "Números mayores que 0", Color.red, 5);
            } else if (nombre.equalsIgnoreCase("")) {
                nombreCd.setText("");
                nombreCd.requestFocus();
                MensajeHilo.setMensaje(mensaje, "Revise el nombre del CD", Color.red, 5);
            } else if (categoria.equalsIgnoreCase("")) {
                categoriaCd.requestFocus();
                MensajeHilo.setMensaje(mensajeCategoria, "Revise la categoría del CD", Color.red, 5);
                /*VALIDACIONES---------------------------------------------------------------------------------*/
            } else {
                /*SI EL ESTUCHE O LA CATEGORÍA NO ESTAN, LOS CREO*/
                if (!isEstuche(estuche)) {
                    crearEstuche(estuche);
                    MensajeHilo.setMensaje(mensajeEstuche, "Estuche " + estuche + " creado!", Color.blue, 5);
                }
                if (!isCategoria(categoria)) {
                    crearCategoria(categoria);
                    MensajeHilo.setMensaje(mensajeCategoria, "Categoría \"" + categoria + "\"creada!", Color.blue, 5);
                }
                /*SI EL ESTUCHE O LA CATEGORÍA NO ESTAN, LOS CREO*/


                if (!Cd.isEspacioOcupado(estuche, espacio)) {/*SI EL ESPACIO NO ESTA OCUPADO*/
                    /*GUARDANDO EL CD-------------------------------------------------------------------------------------------------*/
                    Cd disco = new Cd(nombre, categoria, Integer.toString(espacio), Integer.toString(estuche), contenidoCd.getText());
                    if (guardarDisco(disco)) {
                        MensajeHilo.setMensaje(mensaje, "CD guardado!", Color.blue, 5);
                        reestablecerCampos();
                        panelInformacionCategoria.setVisible(false);
                    } else {
                        MensajeHilo.setMensaje(mensaje, "Error al Guardar CD!", Color.red, 5);
                    }
                    aumentarEspacioDeCdEnUno();
                    /*CARGO LOS CDS AL ARBOL*/
                    cargarCdsAlArbol();
                    /*GUARDANDO EL CD-------------------------------------------------------------------------------------------------*/
                } else {//SI ESTA OCUPADO, PREGUNTO SI DESEA REEMPLAZARLO
                    String nomCd = Cd.getNombreCd(estuche, espacio);
                    if (Mensaje.preguntaSiNo("En el espacio Nº " + espacio + " del estuche Nº " + estuche + " se encuentra el CD \"" + nomCd + "\". ¿Desea Reemplazarlo?") == Mensaje.SI) {
                        Cd disco = new Cd(nombre, categoria, Integer.toString(espacio), Integer.toString(estuche), contenidoCd.getText());
                        if (Cd.reemplazarCd(estuche, espacio, disco)) {
                            MensajeHilo.setMensaje(mensaje, "CD REEMPLAZADO!", Color.blue, 5);
                            reestablecerCampos();
                            aumentarEspacioDeCdEnUno();
                        } else {
                            MensajeHilo.setMensaje(mensaje, "Error al REEMPLAZAR un CD!", Color.red, 5);
                        }
                    }
                    /*CARGO LOS CDS AL ARBOL*/
                    cargarCdsAlArbol();
                }
            }
        } catch (Exception e) {
            //EXCEPCION CUANDO RECOGE LA CATEGORIA Y NO HAY, MANDA UN NULL POINTER EXCECPTION
        }
    }

    /**
     *
     * @param listaCategorias
     * ES UNA LISTA CON TODAS LAS CATEGORIAS DE LA BD
     * @param estuche
     * EL ESTUCHE SELECCIONADO
     * @return
     */
    private TablaInfoEstuche getInfoEstuche(List<Categoria> listaCategorias, Estuche estuche) {
        /*CREO EL OBJETO QUE VOY A DEVOLVER DE LA FUNCION*/
        TablaInfoEstuche tabla = new TablaInfoEstuche();
        /*OBJETO QUE IRA RECIBIENDO LAS CATEGORIAS UNA POR UNA*/
        Categoria categoria;
        /*OBJETO QUE IRA RECIBIENDO LAS CATEGORIAS DE LA TABLA UNA POR UNA*/
        CategoriaTabla catTabla;
        /*VARIABLE QUE ALMACENARA LA CANTIDAD DE DISCOS DE UNA CATEGORIA*/
        int cantidad;
        /*CICLO PARA RECORRER TODAS LAS CATEGORIAS DE LA BD*/
        for (int i = 0; i < listaCategorias.size(); i++) {
            /*OBTENGO LA CATEGORIA Y LA CANTIDAD DE DICHA CATEGORIA SEGUN EL ESTUCHE*/
            categoria = listaCategorias.get(i);
            cantidad = Cd.getCantidadDeCategorias(estuche, categoria);

            /*SI LA CANTIDAD ES 0, ES QUE NO HAY DISCOS DE ESA CATEGORIA EN DICHO ESTUCHE*/
            if (cantidad != 0) {
                /*SI LA CANTIDAD NO ES 0, QUIERE DECIR QUE HAY POR LO MENOS 1 DISCO DE DICHA CATEGORIA EN ESE ESTUCHE*/
                /*ENTONCES CREO EL OBJETO QUE IRÁ EN LA TABLA. LO CREO CON EL NOMBRE DE LA CATEGORIA Y LA CANTIDAD DE DISCOS QUE HAY*/
                catTabla = new CategoriaTabla(categoria.getNombre(), cantidad);
                /*Y AGREGO EL OBJETO A LA LISTA*/
                tabla.addCategoriaTabla(catTabla);
            }
        }
        return tabla;
    }

    private void llenarTablaConDatos(TablaInfoEstuche datosTabla) {
        /*CREO EL OBJETO CATEGORIA PARA PODER RESCATARLOS DE LA LISTA*/
        CategoriaTabla categoria;
        /*OBTENGO LA LISTA DE CATEGORIAS QUE TENGO QUE PONER EN LA TABLA*/
        List<CategoriaTabla> listaCategorias = datosTabla.getListaCategoria();
        /*OBTENGO LA CANTIDAD DE FILAS QUE TENDRA LA TABLA*/
        int filas = listaCategorias.size();
        /*DIBUJO LAS FILAS CORRESPONDIENTES*/
        inicializarTabla(filas);


        /*CICLO PARA RELLENAR LA TABLA CON DATOS*/
        for (int i = 0; i < filas; i++) {
            /*OBTENGO LA CATEGORIA*/
            categoria = listaCategorias.get(i);
            /*Y PONGO DICHA CATEGORIA EN LA TABLA*/
            tablaEstuches.setValueAt(categoria.getNombre(), i, 0);
            tablaEstuches.setValueAt(categoria.getCantidad(), i, 1);
        }
    }

    private void crearScriptBD() {
        Tabla cd = new Tabla("cd");
        Tabla categoria = new Tabla("categoria");
        Tabla estuche = new Tabla("estuche");

        categoria.setPrimaryKeyAutoIncremento("cod_cat", Tipo.numerico.INTEGER);
        categoria.setCampo("nom_cat", Tipo.caracterString.VARCHAR + "(50)");

        estuche.setPrimaryKeyAutoIncremento("cod_est", Tipo.numerico.INTEGER);
        estuche.setCampo("num_est", Tipo.numerico.INTEGER);

        cd.setPrimaryKeyAutoIncremento("cod_cd", Tipo.numerico.INTEGER);
        cd.setCampo("esp_cd", Tipo.numerico.INTEGER);
        cd.setCampo("nom_cd", Tipo.caracterString.VARCHAR + "(50)");
        cd.setCampo("cod_cat", Tipo.numerico.INTEGER);
        cd.setCampo("cod_est", Tipo.numerico.INTEGER);
        cd.setCampo("con_cd", Tipo.caracterString.LONG_VARCHAR);
        cd.setForeignKey("cod_cat", "categoria", "cod_cat");
        cd.setForeignKey("cod_est", "estuche", "cod_est");

        BaseDeDatos.agregarTabla(estuche);
        BaseDeDatos.agregarTabla(categoria);
        BaseDeDatos.agregarTabla(cd);
    }

    private void accionBuscar() {
        String cdAbuscar = textoBusqueda.getText().trim();
        int estuche = Integer.parseInt(estucheCdBuscar.getValue().toString());
        String categoria = categoriaCdBuscar.getSelectedItem().toString();

        if (opEstuche.isSelected() && opCategoria.isSelected()) {
            cds = Cd.buscarCd(cdAbuscar, categoria, estuche);
        } else if (opEstuche.isSelected()) {
            cds = Cd.buscarCd(cdAbuscar, estuche);
        } else if (opCategoria.isSelected()) {
            cds = Cd.buscarCd(cdAbuscar, categoria);
        } else {/*SI SOLO QUIERE BUSCAR. BUSCAR EN TODO*/
            cds = Cd.buscarCd(cdAbuscar);
        }
        cargarDiscosEnLista();
    }

    private void resaltarColorCd(Color color) {
        nombreCd.setBackground(color);

    }

    private void getDimensionesPantalla() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        ALTO_PANTALLA = (int) d.getHeight();
        ANCHO_PANTALLA = (int) d.getWidth();
    }

    private void crearGrafico(Estuche estuche) {
        List<Categoria> listaCategorias = new ArrayList<Categoria>();
        /*OBTENGO TODAS LAS CATEGORIAS DE LA BD*/
        listaCategorias = Cd.getTodasLasCategorias();


        /*EN EL OBJETO datosTabla, TENGO TODOS LOS DATOS DEL ESTUCHE PARA LLENAR LA TABLA*/
        TablaInfoEstuche datosTabla = getInfoEstuche(listaCategorias, estuche);

        List<CategoriaTabla> listaCategoria = datosTabla.getListaCategoria();

        List lista = new ArrayList();
        CategoriaTabla categoria;

        for (int i = 0; i < listaCategoria.size(); i++) {
            categoria = listaCategoria.get(i);
            for (int j = 0; j < categoria.getCantidad(); j++) {
                lista.add(new ModeloCategoriaEstuche(categoria.getNombre()));
            }
        }

        String sep = System.getProperty("file.separator");

        Map<String, String> parametros = new HashMap<String, String>();
        parametros.put("cantidad", Integer.toString(Cd.getCantidadDeDiscos(estuche)));
        parametros.put("version", "JVPort CD v1.1");
        parametros.put("estuche", estuche.getNombre());


        if (Guardar.guardarComo("Reporte " + estuche.getNombre(), "pdf, html", "Guardar Reporte", "/")) {
            HiloReporte h = new HiloReporte(lista, parametros, lblPdf);
            h.start();
        }
    }
    
    private void crearReporteDeTodosLosDiscos() {
        List<Categoria> listaCategorias = new ArrayList<Categoria>();
        /*OBTENGO TODAS LAS CATEGORIAS DE LA BD*/
        listaCategorias = Cd.getTodasLasCategorias();

        List<Estuche> estuches = Cd.getListaDeEstuches();
        /*EN EL OBJETO datosTabla, TENGO TODOS LOS DATOS DEL ESTUCHE PARA LLENAR LA TABLA*/
        TablaInfoEstuche datosTabla ;

        List<CategoriaTabla> listaCategoria ;

        List lista = new ArrayList();
        List listaStrings = new ArrayList();
        CategoriaTabla categoria;
        Estuche est;

        for(int i = 0; i<estuches.size() ;i++){
            est = estuches.get(i);
            datosTabla = getInfoEstuche(listaCategorias, est);
            listaCategoria = datosTabla.getListaCategoria();
            for (int j = 0; j < listaCategoria.size(); j++) {
                categoria = listaCategoria.get(j);
                for (int k = 0; k < categoria.getCantidad(); k++) {
                    listaStrings.add(categoria.getNombre());
                }
            }
        }
        
        /*OREDENANDO LA LISTA DE CATEGORIAS Y PASANDOLA A LA LISTA FINAL QUE SERA ENTREGADA AL REPORTE*/
        Collections.sort(listaStrings);
        /*TENGO QUE ENTRAGARLE AL REPORTE UNA LISTA ORDENADA*/
        for(int i=0 ;i<listaStrings.size();i++){
            lista.add(new ModeloCategoriaEstuche(listaStrings.get(i).toString()));
        }
        
        Map<String, String> parametros = new HashMap<String, String>();
        parametros.put("cantidad", Integer.toString(Cd.getCantidadDeCds()));
        parametros.put("version", "JVPort CD v1.1");
        parametros.put("estuche", "Todos los Estuches ("+Cd.getListaDeEstuches().size()+" Estuches)");


        if (Guardar.guardarComo("Reporte General", "pdf, html", "Guardar Reporte", "/")) {
            
            HiloReporte h = new HiloReporte(lista, parametros, lblPdf);
            h.start();
        }
    }

    private void initAcercaDe() {
        acercade.AcercaDe ad = new acercade.AcercaDe("JVPort CD", "Programa para guardar la información de tus CD'S", "Patricio Pérez Pinto", "2012", "patricio.perez.pinto@gmail.com", acercade.GPL.AMBAS_VERSIONES);
        ad.addComponent(this.menuItemAcercaDe);
    }
}
